home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Games Extra 1996 September
/
Amiga Games Extra CD-ROM 9-1996.iso
/
userbox
/
publicdomain
/
vim-4.2
/
src
/
gui.h
< prev
next >
Wrap
C/C++ Source or Header
|
1996-06-09
|
8KB
|
233 lines
/* vi:set ts=4 sw=4:
*
* VIM - Vi IMproved by Bram Moolenaar
* Motif support by Robert Webb
*
* Do ":help uganda" in Vim to read copying and usage conditions.
* Do ":help credits" in Vim to see a list of people who contributed.
*/
/* For debugging */
/* #define D(x) printf x; */
#define D(x)
#ifdef USE_GUI_MOTIF
# define USE_GUI_X11
# include <Xm/Xm.h>
#endif
/*
* No, Athena doesn't work. Probably never will, there is probably a public
* domain X widget set that is more like Motif which should be used instead.
*/
#ifdef USE_GUI_ATHENA
# define USE_GUI_X11
# include <X11/Intrinsic.h>
# include <X11/StringDefs.h>
#endif
/*
* These macros convert between character row/column and pixel coordinates.
* TEXT_X - Convert character column into X pixel coord for drawing strings.
* TEXT_Y - Convert character row into Y pixel coord for drawing strings.
* FILL_X - Convert character column into X pixel coord for filling the area
* under the character.
* FILL_Y - Convert character row into Y pixel coord for filling the area
* under the character.
* X_2_COL - Convert X pixel coord into character column.
* Y_2_ROW - Convert Y pixel coord into character row.
*/
#define TEXT_X(col) ((col) * gui.char_width + gui.border_offset)
#define TEXT_Y(row) ((row) * gui.char_height + gui.char_ascent \
+ gui.border_offset)
#define FILL_X(col) ((col) * gui.char_width + gui.border_offset)
#define FILL_Y(row) ((row) * gui.char_height + gui.border_offset)
#define X_2_COL(x) (((x) - gui.border_offset) / gui.char_width)
#define Y_2_ROW(y) (((y) - gui.border_offset) / gui.char_height)
/* Menu modes */
#define MENU_NORMAL_MODE 0x01
#define MENU_VISUAL_MODE 0x02
#define MENU_INSERT_MODE 0x04
#define MENU_CMDLINE_MODE 0x08
#define MENU_ALL_MODES 0x0f
/* Indices into GuiMenu->strings[] and GuiMenu->noremap[] for each mode */
#define MENU_INDEX_INVALID -1
#define MENU_INDEX_NORMAL 0
#define MENU_INDEX_VISUAL 1
#define MENU_INDEX_INSERT 2
#define MENU_INDEX_CMDLINE 3
/* Update types for scrollbars, getting more severe on the way down */
#define SB_UPDATE_NOTHING 0
#define SB_UPDATE_VALUE 1
#define SB_UPDATE_HEIGHT 2
#define SB_UPDATE_CREATE 3
/* Indices for arrays of scrollbars */
#define SB_NONE -1
#define SB_LEFT 0
#define SB_RIGHT 1
#define SB_BOTTOM 2
/* Default size of scrollbar */
#define SB_DEFAULT_WIDTH 20
/* Default height of the menu bar */
#define MENU_DEFAULT_HEIGHT 32
/* Highlighting attribute bits. */
#define HL_NORMAL 0x00
#define HL_INVERSE 0x01
#define HL_BOLD 0x02
#define HL_ITAL 0x04
#define HL_UNDERLINE 0x08
#define HL_STANDOUT 0x10
#define HL_SELECTED 0x20
#define HL_ALL 0x3f
#ifdef USE_GUI_X11
/* Selection states for X11 selection. */
#define SELECT_CLEARED 0
#define SELECT_IN_PROGRESS 1
#define SELECT_DONE 2
#define SELECT_MODE_CHAR 0
#define SELECT_MODE_WORD 1
#define SELECT_MODE_LINE 2
#endif
/*
* When we know the cursor is no longer being displayed (eg it has been written
* over).
*/
#define INVALIDATE_CURSOR() (gui.cursor_row = -1)
/* #define INVALIDATE_CURSOR() do{printf("Invalidate cursor %d\n", __LINE__); gui.cursor_row = -1;}while(0) */
/*
* For checking whether cursor needs redrawing, or whether it doesn't need
* undrawing.
*/
#define IS_CURSOR_VALID() (gui.cursor_row >= 0)
typedef struct GuiSelection
{
int owned; /* Flag: do we own the selection? */
FPOS start; /* Start of selected area */
FPOS end; /* End of selected area */
#ifdef USE_GUI_X11
Atom atom; /* Vim's own special selection format */
short_u origin_row;
short_u origin_start_col;
short_u origin_end_col;
short_u word_start_col;
short_u word_end_col;
FPOS prev; /* Previous position */
short_u state; /* Current selection state */
short_u mode; /* Select by char, word, or line. */
#endif
} GuiSelection;
typedef struct GuiMenu
{
int modes; /* Which modes is this menu visible for? */
char_u *name; /* Name shown in menu */
void (*cb)(); /* Call-back routine */
char_u *strings[4]; /* Mapped string for each mode */
int noremap[4]; /* A noremap flag for each mode */
struct GuiMenu *children; /* Children of sub-menu */
struct GuiMenu *next; /* Next item in menu */
#ifdef USE_GUI_X11
Widget id; /* Manage this to enable item */
Widget submenu_id; /* If this is submenu, add children here */
#endif
} GuiMenu;
typedef struct GuiScrollbar
{
int update[2]; /* What kind of update is required? */
/* (For left & right scrollbars) */
int value; /* Represents top line number visible */
int size; /* Size of scrollbar thumb */
int max; /* Number of lines in buffer */
int top; /* Top of scroll bar (chars from row 0) */
int height; /* Height of scroll bar (num rows) */
int status_height; /* Height of status line */
#ifdef USE_GUI_X11
Widget id[2]; /* Id of real scroll bar (left & right) */
#endif
} GuiScrollbar;
typedef struct Gui
{
int in_focus; /* Vim has input focus */
int in_use; /* Is the GUI being used? */
int starting; /* GUI will start in a little while */
int dying; /* Is vim dying? Then output to terminal */
int dofork; /* Use fork() when GUI is starting */
int dragged_sb; /* Which scrollbar being dragged, if any? */
struct window *dragged_wp; /* Which WIN's sb being dragged, if any? */
int col; /* Current cursor column in GUI display */
int row; /* Current cursor row in GUI display */
int cursor_col; /* Physical cursor column in GUI display */
int cursor_row; /* Physical cursor row in GUI display */
int num_cols; /* Number of columns */
int num_rows; /* Number of rows */
int scroll_region_top; /* Top (first) line of scroll region */
int scroll_region_bot; /* Bottom (last) line of scroll region */
long_u highlight_mask; /* Highlight attribute mask */
GuiSelection selection; /* Info about selected text */
GuiMenu *root_menu; /* Root of menu hierarchy */
int num_scrollbars; /* Number of scrollbars (= #windows + 1) */
int scrollbar_width; /* Width of scrollbars */
int menu_height; /* Height of the menu bar */
int menu_is_active; /* TRUE if menu is present */
GuiScrollbar cmdline_sb; /* Scroll bar for command line */
/* (Other scrollbars in 'struct window') */
int which_scrollbars[3];/* Which scrollbar boxes are active? */
int new_sb[3]; /* Which scrollbar boxes are new? */
int prev_wrap; /* For updating the horizontal scrollbar */
int char_width; /* Width of char in pixels */
int char_height; /* Height of char in pixels */
int char_ascent; /* Ascent of char in pixels */
int border_width; /* Width of our border around text area */
int border_offset; /* Total pixel offset for all borders */
#ifdef USE_GUI_X11
Display *dpy; /* X display */
Window wid; /* Window id of text area */
int visibility; /* Is window partially/fully obscured? */
GC text_gc;
GC back_gc;
GC invert_gc;
XFontStruct *norm_font;
XFontStruct *bold_font;
XFontStruct *ital_font;
XFontStruct *boldital_font;
Pixel back_pixel; /* Pixel value of background */
Pixel norm_pixel; /* Pixel value of normal text */
Pixel bold_pixel; /* Pixel value of bold text */
Pixel ital_pixel; /* Pixel value of ital text */
Pixel underline_pixel; /* Pixel value of underlined text */
Pixel cursor_pixel; /* Pixel value of cursor */
Pixel menu_fg_pixel; /* Pixel value of menu foregound */
Pixel menu_bg_pixel; /* Pixel value of menu backgound */
Pixel scroll_fg_pixel; /* Pixel value of scrollbar foreground */
Pixel scroll_bg_pixel; /* Pixel value of scrollbar background */
/* X Resources */
char_u *dflt_font; /* Resource font, used if 'font' not set */
char_u *dflt_bold_fn; /* Resource bold font */
char_u *dflt_ital_fn; /* Resource italic font */
char_u *dflt_boldital_fn; /* Resource bold-italic font */
char_u *geom; /* Geometry, eg "80x24" */
Bool rev_video; /* Use reverse video? */
#endif
} Gui;
extern Gui gui; /* this is in gui.c */
extern int force_menu_update; /* this is in gui.c */